package Link;

public class leet_92 {
}


class Solution_92 {


    /**
     * 截取字段的逻辑
     * @param head   头结点
     * @param left   左边位置 默认下标从1开始
     * @param right  右边位置 默认下标从1开始
     * @return
     */

    public ListNode reverseBetweenCutNode(ListNode head, int left, int right) {
        // 新建一个列表
        ListNode dynamic = new ListNode(-1);
        dynamic.next = head;
        // 新建一个不变动的列表
        ListNode staticNode = dynamic;


        // 设置2个数据数据列表
        ListNode firstNode = new ListNode();
        ListNode lastNode  = new ListNode();
        // 取出第一个firstNode
        for(int i=0; i<left; i++){
            // 拿出到达left前一个的位置节点
            firstNode = dynamic;
            dynamic = dynamic.next;
        }
        // 设置一个Node进行遍历
        ListNode curr = dynamic;

        // 取出lastNode
        for(int i=left; i<right+1; i++){
            // 拿出到达right 的后一个节点
            lastNode = curr.next;
            if(i==right){
                // 截取对应Node
                curr.next=null;
                break;
            }
            curr = curr.next;
        }

        // 此时 firstNode 是左节点前的结点  lastNode 是右节点后的结点位置  dynamic 是一个被截取的结点
        // 完成 dynamic 的翻转
        ListNode dynamicHead = reverseNode(dynamic);
        // 将结点拼接
        firstNode.next = dynamicHead;
        dynamic.next = lastNode;
        return staticNode.next;

    }

    // 返回首节点
    public ListNode reverseNode(ListNode head){
        ListNode pre = head;
        ListNode curr = null;
        while(pre!=null){
            ListNode next = pre.next;
            pre.next = curr;
            curr = pre;
            pre = next;
        }
        return curr;
    }
}